﻿using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;

namespace SharePointOfView.Utilities
{
    /// <summary>
    /// SharePointOfView XSLT Utility class
    /// </summary>
    public static class XSLT
    {
        /// <summary>
        /// Perform an XSL Transformation using XML and XSL content
        /// </summary>
        /// <param name="xmlContent">XML source</param>
        /// <param name="xsltContent">XSL source</param>
        /// <returns>HTML</returns>
        public static string XSLTransform(string xmlContent, string xsltContent)
        {
            return XSLTransform(xmlContent, xsltContent, null);
        }

        /// <summary>
        /// Perform an XSL Transformation using XML and XSL content and with some XSLT arguments
        /// </summary>
        /// <param name="xmlContent">XML source</param>
        /// <param name="xsltContent">XSL source</param>
        /// <param name="xsltArgs">XSLT argument list</param>
        /// <returns>HTML</returns>
        public static string XSLTransform(string xmlContent, string xsltContent, XsltArgumentList xsltArgs)
        {
            string s;
            try
            {
                // Initialize a memorystring for output
                MemoryStream mem = new MemoryStream();
                // Initialize a StreamReader using the MemoryStream
                StreamReader sr = new StreamReader(mem, UTF8Encoding.UTF8);
                // Initialize an XSLTransform object
                XslTransform xTrans = new XslTransform();
                // Load XML Content
                XmlTextReader xmlReader = new XmlTextReader(xmlContent, XmlNodeType.Document, null);
                XPathDocument xmlDoc = new XPathDocument(xmlReader);
                // Load XSL Content
                XmlTextReader xslReader = new XmlTextReader(xsltContent, XmlNodeType.Document, null);
                XPathDocument xslDoc = new XPathDocument(xslReader);
                // Load XSL into transform
                xTrans.Load(xslDoc.CreateNavigator());
                // Perform transformation
                xTrans.Transform(xmlDoc.CreateNavigator(), xsltArgs, mem);
                // Copy stream to string
                mem.Position = 0;
                s = sr.ReadToEnd();
                sr.Close();
                mem.Close();
            }
            catch (Exception ex)
            {
                s = ex.Message;
            }
            return s;
        }
    }
}